import os
import shutil
from pdf2image import convert_from_path

class PdfConverter:
    DEFAULT_OUTPUT_DIR = "./output"
    TEMP_DIR = "./temp_pdfs"

    def __init__(self, file_paths, output_dir=None, dpi=200, image_format="png"):
        """
        初始化转换器。
        :param file_paths: 用户选择的文件路径列表
        :param output_dir: 输出图像保存目录，默认为 ./output
        :param dpi: 图像精度（影响清晰度），默认 200
        :param image_format: 输出格式（png/jpg/tiff 等）
        """
        self.file_paths = file_paths
        self.output_dir = output_dir or self.DEFAULT_OUTPUT_DIR
        self.dpi = dpi
        self.image_format = image_format.lower()

        # 创建输出目录
        os.makedirs(self.output_dir, exist_ok=True)

    def prepare_temp_folder(self):
        """创建并清空临时目录"""
        if os.path.exists(self.TEMP_DIR):
            for f in os.listdir(self.TEMP_DIR):
                os.remove(os.path.join(self.TEMP_DIR, f))
        else:
            os.makedirs(self.TEMP_DIR)

        # 复制文件到 temp 文件夹
        for src in self.file_paths:
            filename = os.path.basename(src)
            dest = os.path.join(self.TEMP_DIR, filename)
            shutil.copy2(src, dest)
            print(f"已复制: {src} → {dest}")

    def convert(self, on_progress=None, on_complete=None):
        """
        执行转换操作（支持回调通知）
        :param on_progress: 回调函数，用于更新进度条或状态栏
        :param on_complete: 转换完成后的回调
        """
        self.prepare_temp_folder()
        total_files = len(self.file_paths)
        for idx, src in enumerate(self.file_paths):
            self._do_convert(src)
            if on_progress:
                on_progress((idx + 1) / total_files * 100)

        if on_complete:
            on_complete()

    def _do_convert(self, pdf_path):
        """将单个 PDF 转换为图像，并输出到指定目录"""
        pdf_name = os.path.splitext(os.path.basename(pdf_path))[0]
        output_subdir = os.path.join(self.output_dir, pdf_name)

        # 创建子目录以存放该 PDF 的图像
        os.makedirs(output_subdir, exist_ok=True)

        print(f"[开始转换] 正在处理文件: {pdf_path}")
        try:
            images = convert_from_path(pdf_path, dpi=self.dpi)
            for i, image in enumerate(images):
                output_path = os.path.join(output_subdir, f"{pdf_name}_page_{i + 1}.{self.image_format}")
                image.save(output_path, format=self.image_format.upper())
                print(f" - 已保存: {output_path}")
        except Exception as e:
            print(f"[错误] 转换失败: {e}")
            raise

    def cleanup(self):
        """清理临时文件夹"""
        if os.path.exists(self.TEMP_DIR):
            shutil.rmtree(self.TEMP_DIR)
            print(f"[清理] 临时目录 {self.TEMP_DIR} 已删除")

